AWS Glue のAmazon Q データ統合を試してみました
AWS事業本部コンサルティング部の石川です。AWS Glue のAmazon Q データ統合は、re:Invent2023で発表され、半年も前の4/30に一般機能可能になった機能であり、今更感が否めないのですが、日本語は正式対応していないけどベストエフォートで動作しないか?など気になるところがあり、復習も兼ねて改めて試してみました。
AWS Glue の Amazon Q データ統合とは
AWS Glueは、Amazon Q とのデータ統合機能によって、AWS Glueを使用したデータ統合プロセスが大幅に簡素化され、開発者の生産性向上とデータ統合ジョブの迅速な構築が可能になりました。
AWS Glueは、Amazon Qデータ統合機能の主要な機能は以下になります。
自然言語によるETLジョブの生成
開発者は自然言語(英語)で要件を説明するだけで、Amazon QがAWS Glue ETLスクリプトを生成します。
説明文(プロンプト)の例
以下の説明文(プロンプト)の要求仕様に対して、適切なコードが生成されます。
Please provide an AWS Glue job that extracts data from Amazon S3, does a filter on the data, and load the data to Amazon Redshift.
Amazon S3 からデータを抽出し、データにフィルターを適用して、データを Amazon Redshift にロードする AWS Glue ジョブを提供してください。
トラブルシューティングの支援
AWS Glueジョブのエラーに対して、Amazon Qに説明を求めたり解決策の提案を依頼したりすることができます。
質問文(プロンプト)の例
以下の質問文(プロンプト)に対して、問題の根本原因を理解し、ステップバイステップの解決手順を得ることができます。
How do I fix out of memory issues in my AWS Glue jobs?
AWS Glue ジョブのメモリ不足の問題を修正するにはどうすればよいですか?
複雑なデータ統合ジョブの構築
一般提供開始に伴い、複数のソース、ターゲット、変換を含む複雑なジョブを構築する機能が追加されました。20以上のAWSデータベース、データウェアハウス、データレイクソースに接続でき、カスタムJDBCやSpark接続も可能になりました。
説明文(プロンプト)の例
以下の説明文(プロンプト)の要求仕様に対して、適切なコードが生成されます。
Write a Glue script that extracts data as JSON from Amazon 53, extracts data from another Amazon 53 bucket as SV, Joins the data, do a filter, and loads the results into Amazon DynamoDB.
Amazon 53 から JSON としてデータを抽出し、別の Amazon 53 バケットから SV としてデータを抽出し、データを結合し、フィルターを適用し、結果を Amazon DynamoDB にロードする Glue スクリプトを記述してください。
AWS Glue の Amazon Q データ統合を試してみる
AWS Glue の Amazon Q データ統合の起動
右上のAmazon Qボタンを押すと、Amazon Qのプロンプトを入力するUIが左から出てきます。
自然言語によるETLジョブの生成
最初に日本語の説明文(プロンプト)として、「Amazon S3 からデータを抽出し、データにフィルターを適用して、データを Amazon Redshift にロードする AWS Glue ジョブを提供してください。」を入力しましたが、以下のようなメッセージが出力され日本語は受け付けてもらえませんでした。システムプロンプトで、英語の文字、数字、および標準の句読点以外は受け付けないようです。
I couldn't understand your question because you used a character I don't recognize. I only understand English characters, numbers, and standard punctuation marks.
認識できない文字が使用されていたため、質問の意味が理解できませんでした。私が理解できるのは、英語の文字、数字、および標準の句読点のみです。
気を取り直して、英語語の説明文(プロンプト)として、"Please provide an AWS Glue job that extracts data from Amazon S3, does a filter on the data, and load the data to Amazon Redshift."を入力しました。すると数秒で下記のETL Jobのコードが生成されました。
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue import DynamicFrame
import re
args = getResolvedOptions(sys.argv, ["JOB_NAME"])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args["JOB_NAME"], args)
# Script generated for node S3DataSource
S3DataSource_dsource1 = glueContext.create_dynamic_frame.from_options(
format_options={},
connection_type="s3",
format="json",
connection_options={"paths": ["<my-path>"]},
transformation_ctx="S3DataSource_dsource1",
)
# Script generated for node FilterTransform
FilterTransform_transform1 = Filter.apply(
frame=S3DataSource_dsource1,
f=lambda row: (row["<column1>"] == 0),
transformation_ctx="FilterTransform_transform1",
)
# Script generated for node RedshiftDataSink
RedshiftDataSink_dsink1 = glueContext.write_dynamic_frame.from_options(
frame=FilterTransform_transform1,
connection_type="redshift",
connection_options={
"redshiftTmpDir": "<my-s3-temp-dir>",
"useConnectionProperties": "true",
"aws_iam_role": "arn:aws:iam::111111:role/Admin",
"dbtable": "public.<my-table>",
"connectionName": "<my-connection>",
},
transformation_ctx="RedshiftDataSink_dsink1",
)
job.commit()
実際に実行した様子が以下になります。画面右上が日本語プロンプトで生成されなかったところです。その下が、英語語プロンプトで生成されたコードです。左のテキストエディタのロックを解除した後、この生成されたコードはコピーしてします。データの入力や出力については自分で指定する必要があります。
トラブルシューティングの支援
英語語の説明文(プロンプト)として、"気を取り直して、英語語の説明文(プロンプト)として、"Please provide an AWS Glue job that extracts data from Amazon S3, does a filter on the data, and load the data to Amazon Redshift."を入力しました。すると数秒で下記の対策が生成されました。
To address out of memory issues in your AWS Glue jobs, you can try the following strategies:
Use AWS Glue's grouping feature:
This helps process files in larger groups, reducing the amount of state the driver needs to maintain.
Particularly useful when dealing with a large number of small files from Amazon S3.
Optimize JDBC connections:
When reading from databases, use AWS Glue dynamic frames instead of Spark dataframes.
Dynamic frames have a default fetch size of 1,000 rows, which helps prevent executor OOM exceptions.
Alternatively, set the fetch size using the Apache Spark
fetchsize
property if using Spark dataframes.
Enable and monitor job metrics:
Turn on Job metrics and AWS Glue Observability metrics in your job definition.
Visualize these metrics on the AWS Glue console and Amazon CloudWatch to identify abnormal memory usage patterns.
Utilize partitioning:
Leverage partitioning information from the AWS Glue Data Catalog to prune large datasets efficiently.
This can significantly reduce the amount of data processed in memory.
Optimize data partitioning:
Ensure your data is partitioned effectively to allow for more efficient processing and memory usage.
Review and optimize transformation logic:
Analyze your ETL code for inefficient transformations that might cause excessive memory consumption.
Adjust Spark configurations:
Fine-tune Spark memory management settings, such as executor memory and driver memory, to better suit your workload.
Consider increasing resources:
If the job consistently runs out of memory, you may need to allocate more DPUs (Data Processing Units) to your Glue job.
Use streaming for large datasets:
Implement streaming techniques when dealing with very large datasets that don't fit in memory.
Implement checkpointing:
For long-running jobs, use checkpointing to save progress and reduce memory pressure.
Remember to test these optimizations in a non-production environment first. If you continue to experience issues, consider reviewing the AWS Glue documentation for more advanced troubleshooting techniques or consult with AWS support for personalized assistance.
AWS Glue ジョブのメモリ不足の問題に対処するには、次の戦略を試すことができます。
AWS Glue のグループ化機能を使用する:
これにより、ファイルをより大きなグループで処理し、ドライバーが維持する必要のある状態の量を減らすことができます。
Amazon S3 からの多数の小さなファイルを処理する場合に特に便利です。
JDBC 接続を最適化する:
データベースから読み取るときは、Spark データフレームではなく AWS Glue 動的フレームを使用します。
動的フレームのデフォルトのフェッチサイズは 1,000 行で、エグゼキューターの OOM 例外を防ぐのに役立ちます。
または、Spark データフレームを使用する場合は、Apache Spark
fetchsize
プロパティを使用してフェッチサイズを設定します。ジョブメトリクスを有効にして監視する:
ジョブ定義でジョブメトリクスと AWS Glue Observability メトリクスをオンにします。
AWS Glue コンソールと Amazon CloudWatch でこれらのメトリクスを視覚化して、異常なメモリ使用パターンを特定します。
パーティション分割を活用する:
AWS Glue データカタログのパーティション分割情報を活用して、大規模なデータセットを効> 率的に整理します。
これにより、メモリ内で処理されるデータの量が大幅に削減されます。
データのパーティション分割を最適化する:データが効果的にパーティション分割され、より効率的な処理とメモリ使用が可能になるようにします。
変換ロジックを確認して最適化する:ETL コードを分析し、過剰なメモリ消費を引き起こす可能性のある非効率的な変換を探します。
Spark 構成を調整する:エグゼキュータ メモリやドライバ メモリなどの Spark メモリ管理設定を微調整して、ワークロードにより適したものにします。
リソースの増加を検討する:ジョブが常にメモリ不足になる場合は、Glue ジョブにさらに多くの DPU (データ処理ユニット) を割り当てる必要がある場合があります。
大規模なデータセットにストリーミングを使用する:メモリに収まらない非常に大きなデータセットを処理する場合は、ストリーミング手法を実装します。
チェックポイントを実装する:長時間実行されるジョブの場合は、チェックポイントを使用して進行状況を保存し、メモリの負荷を軽減します。
これらの最適化は、まず非本番環境でテストすることを忘れないでください。問題が引き続き発生する場合は、AWS Glue ドキュメントでより高度なトラブルシューティング手法を確認するか、AWS サポートに問い合わせて個別のサポートを受けることを検討してください。
料金
Amazon Q Developer のサービスの一つとして提供されていますので、Amazon Q Developer 無料利用枠の範囲であれば、料金が発生しません。詳細については、以下をご覧ください。
最後に
AWS Glue の Amazon Q データ統合機能は、自然言語による ETL ジョブの生成、トラブルシューティングの支援、複雑なデータ統合ジョブの構築など、開発者の生産性向上とデータ統合プロセスの簡素化を実現します。
実際の使用では、日本語入力はサポートされていないものの、英語での入力に対しては迅速かつ適切なコード生成やトラブルシューティングの提案が行われることが確認されました。AIを活用したコーディング支援ツールとして他のサービスと比較したときに、テキストエディタのとの連携や既存コードの改修や提案、その反映などUIとしては改善の余地がありそうです。
生成されるコードやトラブルシューティングについては、モデルやRAGが最新のAWSのベストプラクティスに基づいて生成されるいるところが垣間見え、同じことを実装や調査するにしてもAmazon Q データ統合機能を使うことに新たな発見や学びがあると感じました。
この機能は Amazon Q Developer のサービスの一部として提供され、無料利用枠の範囲内で利用可能です。AWS Glue の Amazon Q データ統合は、データエンジニアリングの効率を大幅に向上させる可能性を秘めており、特に複雑なデータ統合タスクや大規模なデータセットを扱う際に威力を発揮します。今後、日本語サポートの追加や機能の拡張が期待される中、データ統合プロジェクトにおける強力なツールとして注目したいと思います。